﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;
using System.Globalization;

namespace CPEBookWeb
{
    public partial class Editer : System.Web.UI.Page
    {
        /// <summary>
        /// L'utilisateur loggé.
        /// </summary>
        private Utilisateur utilisateur;


        /// <summary>
        /// Appelée au chargement de la page.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            // On vérifie qu'un utilisateur est loggé
            utilisateur = (Utilisateur)Session["Utilisateur"];
            if (utilisateur == null)
            {
                Response.Redirect("Default.aspx");
            }

            // On renseigne la page avec les données en session
            lienBarreProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienConsulterProfil.Text = utilisateur.prenom + " " + utilisateur.nom;
            lienConsulterProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;

            infoemail.Text = utilisateur.email;

            // Si formulaire non soumis, on initialise le formulaire
            if (!Page.IsPostBack)
            {
                initialiserFormulaire();
            }

            // On affiche les demandes d'amis
            rafraichirDemandes();
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des demandes les demandes d'amis.
        /// </summary>
        private void rafraichirDemandes()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelDemandes");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<AmitieUtilisateur> listDemandes = AmisService.getDemandeAjout(utilisateur.idutilisateur);

            if (listDemandes != null)
            {
                // On appele le composant générateur de code
                DemandesAjoutView demandeAjoutView = new DemandesAjoutView
                {
                    Demandes = listDemandes,
                    EcouteurDecision = new EventHandler(btnAccepterOuIgnorer_Click)
                };
                Panel tableDemandes = demandeAjoutView.getTableDemandes();

                // On ajoute la table
                panel.Controls.Add(tableDemandes);
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Ajouter" ou "Accepter".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAccepterOuIgnorer_Click(object sender, EventArgs e)
        {
            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On vérifie que la commande est valide
            if (btnSource.CommandName == "accepter" || btnSource.CommandName == "ignorer")
            {
                // On récupère l'identifiant
                int iddemandeur = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out iddemandeur))
                {
                    // On traite en fonction de la réponse
                    if (btnSource.CommandName == "accepter")
                    {
                        AmisService.confirmerDemande(iddemandeur, utilisateur.idutilisateur);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Profil.aspx?id=" + iddemandeur.ToString());
                    }
                    else
                    {
                        AmisService.ignorerDemande(iddemandeur, utilisateur.idutilisateur);
                    }

                    // On met à jour la liste des demandes
                    rafraichirDemandes();
                }
            }
        }


        /// <summary>
        /// Pré-remplis le formulaire avec les données de l'utilisateur
        /// </summary>
        private void initialiserFormulaire()
        {
            tbPrenom.Text = utilisateur.prenom;
            tbNom.Text = utilisateur.nom;
            lbSexe.SelectedValue = utilisateur.sexe.ToString();
            lbFilliere.SelectedValue = utilisateur.filliere;
            tbPromotion.Text = utilisateur.promotion.ToString();
            tbDateNaissance.Text = utilisateur.datenaissance.ToString("dd/MM/yyyy");
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Enregistrer".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnEnregistrer_Click(object sender, EventArgs e)
        {
            // Pour stocker les erreurs
            List<string> erreurs = new List<string>();

            // Récupération des champs du formulaire
            string prenom = Outils.supprimerEspaces(tbPrenom.Text);
            string nom = Outils.supprimerEspaces(tbNom.Text);
            string password = tbMotDePasse.Text;
            string repeter = tbMotDePasseRepeter.Text;
            char sexe = lbSexe.SelectedValue[0];
            string filliere = lbFilliere.SelectedValue;
            int promotion = 0;
            DateTime datenaissance = new DateTime();
            string datenaissanceText = Outils.supprimerEspaces(tbDateNaissance.Text);

            // Vérification des entrées
            if (prenom.Length < 0)
                erreurs.Add("Entrez un prénom.");
            else if (prenom.Length > 12)
                erreurs.Add("Prénom trop long (12 caractères max).");
            if (nom.Length < 0)
                erreurs.Add("Entrez un nom.");
            else if (nom.Length > 12)
                erreurs.Add("Nom trop long (12 caractères max).");
            if (password != repeter)
                erreurs.Add("Les deux mots de passe diffèrent.");
            else if (password.Length > 64)
                erreurs.Add("Mot de passe trop long (64 caractères max).");
            if (sexe != Sexe.MASCULIN && sexe != Sexe.FEMININ)
                erreurs.Add("Sexe invalide.");
            if (!Filliere.getFillieres().Contains(filliere))
                erreurs.Add("Fillière invalide.");
            if (!Int32.TryParse(tbPromotion.Text, out promotion))
                erreurs.Add("Promotion invalide.");
            else if (promotion < 1900 && promotion > 2099)
                erreurs.Add("Promotion invalide.");
            if (datenaissanceText == null)
                erreurs.Add("Choisissez une date de naissance");
            else
            {
                // Vérification de la date
                CultureInfo cult = new CultureInfo("fr-FR");
                DateTimeStyles stl = DateTimeStyles.AssumeLocal;
                if (!DateTime.TryParse(datenaissanceText, cult, stl, out datenaissance))
                    erreurs.Add("Date de naissance invalide.");
            }

            // Le mot de passe peut ne pas avoir été changé
            if (password == "")
            {
                password = utilisateur.password;
            }

            // Si aucune erreur on va ajouter l'utilisateur
            if (erreurs.Count == 0)
            {
                // Appel du service métier
                UtilisateurService.majUtilisateur(utilisateur.idutilisateur, prenom, nom, utilisateur.email, password, sexe, filliere, promotion, datenaissance);

                // On prépare pour rafraîchir les données de session
                utilisateur.prenom = Outils.premiereLettreMajuscule(prenom);
                utilisateur.nom = Outils.premiereLettreMajuscule(nom);
                utilisateur.password = password;
                utilisateur.sexe = sexe;
                utilisateur.filliere = filliere;
                utilisateur.promotion = promotion;
                utilisateur.datenaissance = datenaissance;

                // On remet en session et on redirige sur le profil
                Session["Utilisateur"] = utilisateur;
                Response.Redirect("Profil.aspx?id=" + utilisateur.idutilisateur);
            }
            else
            {
                // Sinon on concatène les erreurs
                string chaine = "";
                foreach (string erreur in erreurs)
                {
                    chaine += erreur + " \n";
                }

                // On les affiche
                labErreurInscription.Text = chaine;
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Rechercher".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void rechercheBouton_Click(object sender, EventArgs e)
        {
            Response.Redirect("Recherche.aspx?r=" + rechercheInput.Text);
        }

    }
}